package cn.fl.tag.service.impl;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cn.cmm.base.framework.context.ApplicationContextAccessor;
import cn.cmm.base.framework.utils.BaseLogUtils;
import cn.cmm.base.framework.utils.CollectionUtils;
import cn.cmm.base.framework.utils.StringUtils;
import cn.fl.framework.base.context.CurrentThreadContext;
import cn.fl.system.service.ISysPgInfoService;

/**
 * Span 
 * 返回的HTML串为一个完整的Span标签, 在开始的时候包含开始尖括号内内容, 结束的时候把标签结束
 * EVAL_BODY_INCLUDE：告诉服务器正文的内容，并把这些内容送入输出流 
 * SKIP_BODY：告诉服务器不要处理正文内容 
 * EVAL_PAGE：让服务器继续执行页面 
 * SKIP_PAGE：让服务器不要处理剩余的页面 
 * EVAL_BODY_AGAIN：让服务器继续处理正文内容，只有doAfterBody方法可以返回 
 * EVAL_BODY_BUFFERED：BodyTag接口的字段，在doStartTag()返回 
 * EVAL_BODY_INCLUDE、SKIP_BODY一般由doStartTag()返回，而EVAL_PAPGE、SKIP_PAGE由doEndTag()返回。
 * @author FUJINGRUN
 */
public class UISpanTag extends BodyTagSupport {

	private static final long serialVersionUID = -8274571478487279704L;

	private static final Logger logger = LoggerFactory.getLogger(UISpanTag.class);
	
	/**
	 * 系统页面服务
	 */
	private ISysPgInfoService sysPgInfoService = (ISysPgInfoService)ApplicationContextAccessor.getBean("sysPgInfoServiceImpl");
	
	
	/**
	 * 页面代码
	 */
	private String pgCd;
	
	/**
	 * 组件代码
	 */
	private String cmpCd;
	
	/**
	 * 组织架构集合代码
	 */
	private List<String> orgCds;
	
	/**
	 * 系统代码
	 */
	private String sysCd;
	
	/**
	 * 角色集合
	 */
	private List<Long> roleIds;
	
	
	/**
	 * 判断是否要闭合标签
	 */
	private boolean skipBody = false;
	
	@Override
	public int doStartTag() throws JspException {
		
		if(CollectionUtils.isEmpty(orgCds)){
			orgCds = new ArrayList<>();
			orgCds.add(CurrentThreadContext.getCurrentOrgCd());
		}
		
		if(StringUtils.isBlank(sysCd)){
			sysCd = CurrentThreadContext.getCurrentSysCd();
		}
		
		if(CollectionUtils.isEmpty(roleIds)){
			roleIds = new ArrayList<>();
			roleIds.add(CurrentThreadContext.getCurrentRoleId());
		}
		
		try {
			String html = this.sysPgInfoService.getSysPgCmp(CurrentThreadContext.getCurrentSysCd(), 
					CurrentThreadContext.getCurrentRoleId(), CurrentThreadContext.getCurrentOrgCd(), 
					getPgCd(), getCmpCd());
			if(StringUtils.isEmpty(html)){
				return EVAL_PAGE;//不处理正文内容
			}
			JspWriter out = this.pageContext.getOut();
			out.print(html.replace("</span>", ""));//要把后缀去掉,以便标签内元素能够正确包含在标签内,等标签结束后要闭合
		} catch (IOException e) {
			BaseLogUtils.error(logger, "-", "异常", e);
		}
		
		skipBody = true;
		return EVAL_BODY_INCLUDE;
	}
	
	@Override
	public int doEndTag() throws JspException {
		if(skipBody){
			JspWriter out = this.pageContext.getOut();
			try {
				 out.print("</span>");//要闭合标签
			} catch (IOException e) {
			BaseLogUtils.error(logger, "-", "异常", e);
			}
		}
		return super.doEndTag();
	}
	
	/**
	 * 页面代码
	 */
	public String getPgCd() {
		return pgCd;
	}

	/**
	 * 页面代码
	 */
	public void setPgCd(String pgCd) {
		this.pgCd = pgCd;
	}

	/**
	 * 组件代码
	 */
	public String getCmpCd() {
		return cmpCd;
	}

	/**
	 * 组件代码
	 */
	public void setCmpCd(String cmpCd) {
		this.cmpCd = cmpCd;
	}
	
	/**
	 * 系统代码
	 */
	public String getSysCd() {
		return sysCd;
	}

	/**
	 * 系统代码
	 */
	public void setSysCd(String sysCd) {
		this.sysCd = sysCd;
	}

	/**
	 * 组织架构代码集合
	 */
	public List<String> getOrgCds() {
		return orgCds;
	}

	/**
	 * 组织架构代码集合
	 */
	public void setOrgCds(List<String> orgCds) {
		this.orgCds = orgCds;
	}

	/**
	 * 角色集合
	 */
	public List<Long> getRoleIds() {
		return roleIds;
	}

	/**
	 * 角色集合
	 */
	public void setRoleIds(List<Long> roleIds) {
		this.roleIds = roleIds;
	}
	
}
